/*
 * 	loopedSlider 0.5.6 - jQuery plugin
 *	written by Nathan Searles	
 *	http://nathansearles.com/loopedslider/
 *
 *	Copyright (c) 2009 Nathan Searles (http://nathansearles.com/)
 *	Dual licensed under the MIT (MIT-LICENSE.txt)
 *	and GPL (GPL-LICENSE.txt) licenses.
 *
 *	Built for jQuery library
 *	http://jquery.com
 *	Compatible with jQuery 1.3.2+
 *
 */

/*
 *	markup example for $("#loopedSlider").loopedSlider();
 *
 *	<div id="loopedSlider">	
 *		<div class="container">
 *			<div class="slides">
 *				<div><img src="01.jpg" alt="" /></div>
 *				<div><img src="02.jpg" alt="" /></div>
 *				<div><img src="03.jpg" alt="" /></div>
 *				<div><img src="04.jpg" alt="" /></div>
 *			</div>
 *		</div>
 *		<a href="#" class="previous">previous</a>
 *		<a href="#" class="next">next</a>	
 *	</div>
 *
 */

if (typeof jQuery != 'undefined') {
    jQuery(function($) {
        $.fn.extend({
            loopedSlider: function(options) {
                var settings = $.extend({}, $.fn.loopedSlider.defaults, options);

                return this.each(
                        function() {
                            if ($.fn.jquery < '1.3.2') {
                                return;
                            }
                            var $t = $(this);
                            var o = $.metadata ? $.extend({}, settings, $t.metadata()) : settings;

                            var distance = 0;
                            var times = 1;
                            var slides = $(o.slides, $t).children().size();
                            var width = $(o.slides, $t).children().outerWidth();
                            var position = 0;
                            var active = false;
                            var number = 0;
                            var interval = 0;
                            var restart = 0;
                            var pagination = $("." + o.pagination + " li a", $t);

                            if (o.addPagination && !$(pagination).length) {
                                var buttons = slides;
                                $($t).append("<ul class=" + o.pagination + ">");
                                $(o.slides, $t).children().each(function() {
                                    if (number < buttons) {
                                        $("." + o.pagination, $t).append("<li><a rel=" + (number + 1) + " href=\"#\" >" + (number + 1) + "</a></li>");
                                        number = number + 1;
                                    } else {
                                        number = 0;
                                        return false;
                                    }
                                    $("." + o.pagination + " li a:eq(0)", $t).parent().addClass("active");
                                });
                                pagination = $("." + o.pagination + " li a", $t);
                            } else {
                                $(pagination, $t).each(function() {
                                    number = number + 1;
                                    $(this).attr("rel", number);
                                    $(pagination.eq(0), $t).parent().addClass("active");
                                });
                            }

                            if (slides === 1) {
                                $(o.slides, $t).children().css({position: "absolute", left: position, display: "block"});
                                return;
                            }

                            $(o.slides, $t).css({width: (slides * width)});

                            $(o.slides, $t).children().each(function() {
                                $(this).css({position: "absolute", left: position, display: "block"});
                                position = position + width;
                            });

                            $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: -width});

                            if (slides > 3) {
                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: -width});
                            }

                            if (o.autoHeight) {
                                autoHeight(times);
                            }

                            $(".next", $t).click(function() {
                                if (active === false) {
                                    animate("next", true);
                                    if (o.autoStart) {
                                        if (o.restart) {
                                            autoStart();
                                        }
                                        else {
                                            clearInterval(sliderIntervalID);
                                        }
                                    }
                                }
                                return false;
                            });

                            $(".previous", $t).click(function() {
                                if (active === false) {
                                    animate("prev", true);
                                    if (o.autoStart) {
                                        if (o.restart) {
                                            autoStart();
                                        }
                                        else {
                                            clearInterval(sliderIntervalID);
                                        }
                                    }
                                }
                                return false;
                            });

                            if (o.containerClick) {
                                $(o.container, $t).click(function() {
                                    if (active === false) {
                                        animate("next", true);
                                        if (o.autoStart) {
                                            if (o.restart) {
                                                autoStart();
                                            }
                                            else {
                                                clearInterval(sliderIntervalID);
                                            }
                                        }
                                    }
                                    return false;
                                });
                            }

                            $(pagination, $t).click(function() {
                                if ($(this).parent().hasClass("active")) {
                                    return false;
                                }
                                else {
                                    times = $(this).attr("rel");
                                    $(pagination, $t).parent().siblings().removeClass("active");
                                    $(this).parent().addClass("active");
                                    animate("fade", times);
                                    if (o.autoStart) {
                                        if (o.restart) {
                                            autoStart();
                                        }
                                        else {
                                            clearInterval(sliderIntervalID);
                                        }
                                    }
                                }
                                return false;
                            });

                            if (o.autoStart) {
                                sliderIntervalID = setInterval(function() {
                                    if (active === false) {
                                        animate("next", true);
                                    }
                                }, o.autoStart);
                                function autoStart() {
                                    if (o.restart) {
                                        clearInterval(sliderIntervalID);
                                        clearInterval(interval);
                                        clearTimeout(restart);
                                        restart = setTimeout(function() {
                                            interval = setInterval(function() {
                                                animate("next", true);
                                            }, o.autoStart);
                                        }, o.restart);
                                    } else {
                                        sliderIntervalID = setInterval(function() {
                                            if (active === false) {
                                                animate("next", true);
                                            }
                                        }, o.autoStart);
                                    }
                                }
                                ;
                            }

                            function current(times) {
                                if (times === slides + 1) {
                                    times = 1;
                                }
                                if (times === 0) {
                                    times = slides;
                                }
                                $(pagination, $t).parent().siblings().removeClass("active");
                                $(pagination + "[rel='" + (times) + "']", $t).parent().addClass("active");
                            }
                            ;

                            function autoHeight(times) {
                                if (times === slides + 1) {
                                    times = 1;
                                }
                                if (times === 0) {
                                    times = slides;
                                }
                                var getHeight = $(o.slides, $t).children(":eq(" + (times - 1) + ")", $t).outerHeight();
                                $(o.container, $t).animate({height: getHeight}, o.autoHeight);
                            }
                            ;

                            function animate(dir, clicked) {
                                active = true;
                                switch (dir) {
                                    case "next":
                                        times = times + 1;
                                        distance = (-(times * width - width));
                                        current(times);
                                        if (o.autoHeight) {
                                            autoHeight(times);
                                        }
                                        if (slides < 3) {
                                            if (times === 3) {
                                                $(o.slides, $t).children(":eq(0)").css({left: (slides * width)});
                                            }
                                            if (times === 2) {
                                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: width});
                                            }
                                        }
                                        $(o.slides, $t).animate({left: distance}, o.slidespeed, function() {
                                            if (times === slides + 1) {
                                                times = 1;
                                                $(o.slides, $t).css({left: 0}, function() {
                                                    $(o.slides, $t).animate({left: distance})
                                                });
                                                $(o.slides, $t).children(":eq(0)").css({left: 0});
                                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: -width});
                                            }
                                            if (times === slides)
                                                $(o.slides, $t).children(":eq(0)").css({left: (slides * width)});
                                            if (times === slides - 1)
                                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({left: (slides * width - width)});
                                            active = false;
                                        });
                                        break;
                                    case "prev":
                                        times = times - 1;
                                        distance = (-(times * width - width));
                                        current(times);
                                        if (o.autoHeight) {
                                            autoHeight(times);
                                        }
                                        if (slides < 3) {
                                            if (times === 0) {
                                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: (-width)});
                                            }
                                            if (times === 1) {
                                                $(o.slides, $t).children(":eq(0)").css({position: "absolute", left: 0});
                                            }
                                        }
                                        $(o.slides, $t).animate({left: distance}, o.slidespeed, function() {
                                            if (times === 0) {
                                                times = slides;
                                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: (slides * width - width)});
                                                $(o.slides, $t).css({left: -(slides * width - width)});
                                                $(o.slides, $t).children(":eq(0)").css({left: (slides * width)});
                                            }
                                            if (times === 2)
                                                $(o.slides, $t).children(":eq(0)").css({position: "absolute", left: 0});
                                            if (times === 1)
                                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: -width});
                                            active = false;
                                        });
                                        break;
                                    case "fade":
                                        times = [times] * 1;
                                        distance = (-(times * width - width));
                                        current(times);
                                        if (o.autoHeight) {
                                            autoHeight(times);
                                        }
                                        $(o.slides, $t).children().fadeOut(o.fadespeed, function() {
                                            $(o.slides, $t).css({left: distance});
                                            $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({left: slides * width - width});
                                            $(o.slides, $t).children(":eq(0)").css({left: 0});
                                            if (times === slides) {
                                                $(o.slides, $t).children(":eq(0)").css({left: (slides * width)});
                                            }
                                            if (times === 1) {
                                                $(o.slides, $t).children(":eq(" + (slides - 1) + ")").css({position: "absolute", left: -width});
                                            }
                                            $(o.slides, $t).children().fadeIn(o.fadespeed);
                                            active = false;
                                        });
                                        break;
                                    default:
                                        break;
                                }
                            }
                            ;
                        }
                );
            }
        });
        $.fn.loopedSlider.defaults = {
            container: ".container", //Class/id of main container. You can use "#container" for an id.
            slides: ".slides", //Class/id of slide container. You can use "#slides" for an id.
            pagination: "pagination", //Class name of parent ul for numbered links. Don't add a "." here.
            containerClick: true, //Click slider to goto next slide? true/false
            autoStart: 0, //Set to positive number for true. This number will be the time between transitions.
            restart: 0, //Set to positive number for true. Sets time until autoStart is restarted.
            slidespeed: 300, //Speed of slide animation, 1000 = 1second.
            fadespeed: 400, //Speed of fade animation, 1000 = 1second.
            autoHeight: 0, //Set to positive number for true. This number will be the speed of the animation.
            addPagination: false //Add pagination links based on content? true/false
        };
    });
}